#include <GL/glut.h>

//移动谱线级次
void fftshift(double *temp , int Im_W , int Im_H);

//傅里叶变换
void FFT2(double *temp , int Im_W , int Im_H);

//逆傅里叶变换
void iFFT2(double *temp , int Im_W , int Im_H);

//矩孔初始化
void init_rec(double *temp , int Im_W , int Im_H , int hol_w);

//圆孔初始化
void init_circ(double *temp , int Im_W , int Im_H , int R);

//像素矩阵元初始/赋值为R、G、B
void init_Pix(GLubyte *img , int w , int h , int L , int R , int G , int B);

//像素矩阵元比例缩放，系数为R、G、B
void trans_Pix(GLubyte *img , int w , int h , int L , int R , int G , int B);

//矩阵转换为图片
//real:实部权值，image:虚部权值，R、G、B:颜色分量系数，stand=1:规范最大值为255
void CP_m2i(double *mat , GLubyte *img , int w , int h , int L , float real , float image , float R , float G , float B , int stand);

//图片转换为矩阵
//real:实部权值，image:虚部权值，R、G、B:颜色分量系数
void CP_i2m(GLubyte *img , double *mat , int w , int h , int L , float R , float G , float B , float real , float image);

/*圆孔屏，temp初始图片，Im_W图片宽，Im_H图片高，R孔半径
* o_x孔相对中心水平位移，o_y孔相对中心垂直位移
* fac_hol_rel孔实部透过系数,fac_hol_img孔虚部透过系数
* fac_scrn_rel屏实部透过系数,fac_scrn_img屏虚部透过系数
*/
void screen_circ(double *temp,int Im_W,int Im_H,int R,int o_x,int o_y,double fac_hol_rel,double fac_hol_img,double fac_scrn_rel,double fac_scrn_img);

/*矩孔屏,temp初始图片，Im_W图片宽，Im_H图片高，hol_w孔宽，hol_h孔高
* o_x孔相对中心水平位移，o_y孔相对中心垂直位移
* fac_hol_rel孔实部透过系数,fac_hol_img孔虚部透过系数
* fac_scrn_rel屏实部透过系数,fac_scrn_img屏虚部透过系数
*/
void screen_rec(double *temp,int Im_W,int Im_H,int hol_w,int hol_h,int o_x,int o_y,double fac_hol_rel,double fac_hol_img,double fac_scrn_rel,double fac_scrn_img);

/*平面透过屏，temp初始图片，Im_W图片宽，Im_H图片高
* fac_rel实部透过系数,fac_img虚部透过系数
*/
void screen_plate(double *temp,int Im_W,int Im_H,double fac_rel,double fac_img);

/*函数透过率屏：给出实部与虚部的二元函数（无参），对矩阵元实行变换
* f_rel实部变换函数指针，f_img虚部变换函数指针
* 以图片左下角为原点
*/
void screen_func2(double *temp,int Im_W,int Im_H,double (*f_rel)(double x , double y),double (*f_img)(double x,double y));

/*二维三角透过率网屏
* Tx_rel,Ty_rel,Tx_img,Ty_img实虚部三角波周期
* min_rel,max_rel,min_img,max_img实虚部调制上下限
*/
void screen_grid(double *temp,int Im_W,int Im_H,double Tx_rel,double Ty_rel,double min_rel,double max_rel,
	                                            double Tx_img,double Ty_img,double min_img,double max_img);

//半色调屏（模低于阀值的矩阵元置零
void screen_half(double *temp,int Im_W,int Im_H,double limit);
